#include <stdlib.h>
#include "my_inc/main_login.h"

// 全局变量用于记录滑动状态
static lv_point_t start_point;          // 记录滑动起始坐标点
static bool is_dragging = false;        // 标记是否正在拖动中
static bool has_triggered = false;      // 标记本次滑动是否已触发过事件
static slide_direction_t last_direction = SLIDE_NONE;  // 记录最后一次检测到的滑动方向

/**
 * @brief 获取最后一次滑动方向
 * @return slide_direction_t 滑动方向枚举值：
 *         SLIDE_NONE = 0 (无滑动)
 *         SLIDE_LEFT = 1 (向左滑动) 
 *         SLIDE_RIGHT = 2 (向右滑动)
 *         SLIDE_UP = 3 (向上滑动)
 *         SLIDE_DOWN = 4 (向下滑动)
 * @note 调用此函数后，内部方向值会自动重置为SLIDE_NONE，
 *       避免重复获取到同一个滑动事件
 */
slide_direction_t get_slide_direction(void)
{
    slide_direction_t dir = last_direction;  // 保存当前方向值
    last_direction = SLIDE_NONE;             // 重置为无滑动状态
    return dir;                              // 返回检测到的方向
}

/**
 * @brief 触摸事件处理函数
 * @param e LVGL事件对象
 */
static void on_press(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_indev_t * indev = lv_indev_get_act();
    
    if(code == LV_EVENT_PRESSED) {
        // 按下事件：记录起始点并重置所有状态
        if(indev) {
            lv_indev_get_point(indev, &start_point);
            is_dragging = true;
            has_triggered = false;
        }
    }
    else if(code == LV_EVENT_PRESSING && is_dragging) {
        // 持续按压事件：检测滑动方向和距离
        if(indev) {
            lv_point_t current_point;
            lv_indev_get_point(indev, &current_point);
            
            // 计算滑动距离
            lv_coord_t dx = current_point.x - start_point.x;
            lv_coord_t dy = current_point.y - start_point.y;
            
            // 计算主要滑动方向的距离（取绝对值较大的那个）
            lv_coord_t distance = abs(dx) > abs(dy) ? abs(dx) : abs(dy);
            
            // 只有当滑动距离大于100像素且尚未触发过时才处理
            if(distance > 100 && !has_triggered) {
                // 判断滑动方向并设置对应的枚举值
                if(abs(dx) > abs(dy)) {
                    if(dx > 0) {
                        last_direction = SLIDE_RIGHT;  // 设置为向右滑动
                        // printf("→ 向右滑动\n");
                    } else {
                        last_direction = SLIDE_LEFT;   // 设置为向左滑动
                        // printf("← 向左滑动\n");
                    }
                } else {
                    if(dy > 0) {
                        last_direction = SLIDE_DOWN;   // 设置为向下滑动
                        // printf("↓ 向下滑动\n");
                    } else {
                        last_direction = SLIDE_UP;     // 设置为向上滑动
                        // printf("↑ 向上滑动\n");
                    }
                }
                
                has_triggered = true;     // 标记已触发，防止重复检测
                start_point = current_point; // 更新起始点为当前位置
            }
        }
    }
    else if(code == LV_EVENT_RELEASED) {
        // 释放事件：重置拖动状态
        is_dragging = false;
        has_triggered = false;
    }
}

/**
 * @brief 初始化滑动检测功能
 * @param cont 需要检测滑动的容器对象
 */
void slide(lv_obj_t * cont)
{
    // 设置容器属性
    lv_obj_add_flag(cont, LV_OBJ_FLAG_CLICKABLE);       // 使对象可接收点击事件
    lv_obj_clear_flag(cont, LV_OBJ_FLAG_SCROLLABLE);    // 禁用滚动，避免冲突
    
    // 注册事件回调函数
    lv_obj_add_event_cb(cont, on_press, LV_EVENT_PRESSED, NULL);   // 按下事件
    lv_obj_add_event_cb(cont, on_press, LV_EVENT_PRESSING, NULL);  // 持续按压事件
    lv_obj_add_event_cb(cont, on_press, LV_EVENT_RELEASED, NULL);  // 释放事件
    
    printf("滑动检测初始化完成！\n");
    printf("滑动要求:距离大于100像素,每次滑动只触发一次\n");
}
